Copyright(C) 1994 Terumasa KODAKA , Takeshi KONO ■カレンダ/インターバルタイマ BIOS INT 1Ch - Function 00h 分類 TIMER BIOS 名前 日付・時刻の読み出し 対象 ノーマル,ハイレゾ,PC-98LT・HA 入力 AH=00h ES:BX=データバッファの先頭アドレス 出力 AX=不定 <バッファの形式> ------------------+----------------------------------- アドレス |内容 ------------------+----------------------------------- ES:BX+00h |年(BCD:00〜99h) ES:BX+01h bit 7〜4|月(1h=1月, …, Ch=12月) bit 3〜0|曜日(0h=日曜, …, 6h=土曜) ES:BX+02h |日(BCD:01〜31h) ES:BX+03h |時(BCD:00〜23h) ES:BX+04h |分(BCD:00〜59h) ES:BX+05h |秒(BCD:00〜59h) ------------------+----------------------------------- * BCDは、bit 7〜4が10の位、bit 3〜0が1の位 解説 o 日付と時刻をカレンダ時計LSIから取得して、指定されたバッファに書き込む。 u カレンダ時計LSIから時刻情報を取り出す場合、1ビットづつシリアルに 読み出す必要があるため、このファンクションの実行には0.5m〜1.0m秒 程度(条件によって異なる)の時間がかかる。 o PC-9801初代・E・F・M・U・VM2・VF・UV2, PC-98XA, PC-98LTでは、年の情報が メモリスイッチ8に格納されているため、年は自動的に更新されない。閏年も 考慮されない。 これ以外の機種では、年の更新や閏年の2月29日の設定は自動的に行われる。 u PC-9801P・BA2・BS2・BX2, PC-9821Ne・Ap2・As2・Bp・Bs・Be・Tsの一部のロット では、電源OFFの状態で日付が変わったとき、年の更新や閏年の2月29日の 設定が自動的に行われない。NECから、この症状を回避するためのパッチが 公開されている。このパッチをIO.SYSにあてるとINT 1Chをフックするように なるが、このとき、最長でパッチ前に比べて3倍程度の時間がかかることが ある。 u テクニカルデータブックにはAXが不定になるという記述があるが、 実際には変化しない。 関連 INT 1Ch - Function 01h I/O 0020h A000:3FFEh[PC-9801初代・E・F・M・U・VM2・VF・UV2] E000:3FFEh[PC-98XA] D000:3808h[PC-98LT] INT 1Ch - Function 01h 分類 TIMER BIOS 名前 日付・時刻の設定 対象 ノーマル,ハイレゾ,PC-98LT・HA 入力 AH=01h ES:BX=データバッファの先頭アドレス <バッファの形式> ------------------+----------------------------------- アドレス |内容 ------------------+----------------------------------- ES:BX+00h |年(BCD:00〜99h) ES:BX+01h bit 7〜4|月(1h=1月, …, Ch=12月) bit 3〜0|曜日(0h=日曜, …, 6h=土曜) ES:BX+02h |日(BCD:01〜31h) ES:BX+03h |時(BCD:00〜23h) ES:BX+04h |分(BCD:00〜59h) ES:BX+05h |秒(BCD:00〜59h) ------------------+----------------------------------- * BCDは、bit 7〜4が10の位、bit 3〜0が1の位 出力 AX=不定 解説 o 日付と時刻をカレンダ時計LSIに設定する。 u カレンダ時計LSIに時刻情報を設定する場合、1ビットづつシリアルに書き込む 必要があるため、このファンクションの実行には0.5m〜1.0m秒程度(機種、 条件によって異なる)の時間がかかる。 u テクニカルデータブックにはAXが不定になるという記述があるが、 実際には変化しない。 関連 INT 1Ch - Function 00h I/O 0020h A000:3FFEh[PC-9801初代・E・F・M・U・VM2・VF・UV2] E000:3FFEh[PC-98XA] D000:3808h[PC-98LT] INT 1Ch - Function 02h 分類 TIMER BIOS 名前 インターバルタイマの設定(シングルイベント) 対象 ノーマル,ハイレゾ,PC-98LT・HA 入力 AH=02h CX=インターバルタイマ値(単位:10ms) * 0を指定すると10000hとして動作 ES:BX=タイムアウト時のユーザルーチンエントリ 出力 AX=不定 解説 o このファンクションを実行してからCXで指定された時間が経過すると、 ES:BXで指定されたユーザルーチンが1回呼び出される。 このファンクションはシングルイベント用なので、一度このファンクションで 設定を行うと、タイムアウトするまで再度このファンクションを実行する ことはできない。タイムアウトする前に、再度このファンクションを実行する と、その前の設定は無効になり、新しい設定だけが有効になる。 o ハイレゾモードでは、このファンクションで行った設定がタイムアウトする 前でも、INT 1Ch - Function 04h,05hのマルチイベント対応ファンクションは 実行できる。このとき、このファンクションで行った設定が無効になることは ない。 u ノーマルモード(PC-98DO+を除く)とPC-98LT・HAでは、このファンクションを 実行すると以下のような処理を行う。 - ES:BXで指定したユーザルーチンのエントリアドレスをINT 07hベクタに セットする。 - CXで指定したインターバルタイマ値を0000:058Ahにセットする。 - タイマ(8253A)のチャネル0に、10ms周期のパルスが発生するよう設定。 - 割り込みコントローラ(8259A)のマスタに、INT 08h(外部割り込み)の 割り込み許可の設定。 以後、10ms毎にINT 08h(外部割り込み)が発生し、BIOS内のタイマ割り込み ハンドラがインターバルタイマ値(0000:058Ah)をデクリメント する。インターバルタイマ値が0になってタイムアウトすると、INT 07hを 実行してユーザルーチンを呼び出す。 u ハイレゾモードとPC-98DO+では、このファンクションを実行すると以下の ような処理を行う。 - ES:BXで指定したユーザルーチンのエントリアドレスを0000:044Chに セットする。 - CXで指定したインターバルタイマ値を0000:058Ahにセットする。 - タイマ割り込みが使用中でなければ、タイマ(8253A)のチャネル0に、 10ms周期のパルスが発生するよう設定。また、割り込みコントローラ (8259A)のマスタに、INT 08h(外部割り込み)の割り込み許可の設定。 以後、10ms毎にINT 08h(外部割り込み)が発生し、BIOS内のタイマ割り込み ハンドラがインターバルタイマ値(0000:058Ah)をデクリメント する。インターバルタイマ値が0になってタイムアウトすると、PUSHFした あと、0000:044ChにセットされているアドレスをFARコールしてユーザ ルーチンを呼び出す。 o ユーザルーチンを作成する際は、以下のようにする。 - ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ ならない。 - 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン 移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。 - ユーザルーチンの処理が終了したら、IRETで戻る。 u ユーザルーチンが呼び出されたとき、CPUのIF(Interrupt Flag)の状態は 機種により次のように異なる。ノーマルモード(PC-98DO+を除く)と PC-98LT・HAでは0(割り込み禁止状態)。ハイレゾモードとPC-98DO+では1 (割り込み許可状態)。 u PC-98DO+では、ユーザルーチンのアドレスはINT 07hベクタではなく、 ハイレゾと同じアドレス(0000:044Ch)を使用する。 u PC-9801初代の一部のロットに、タイマ用ダウンカウンタ0000:058Ahに アクセスすべき部分で、0050:058Ahをアクセスしているものがあり、 そのような場合には正しく動作しない。 u テクニカルデータブックにはAXが不定になるという記述があるが、 実際には変化しない。 関連 INT 07h(タイマBIOS) INT 08h(外部割込) 0000:044Ch[ハイレゾ,PC-98DO+] 0000:0459h bit 5[ハイレゾ] 0000:058Ah I/O 0000h I/O 0071h INT 1Ch - Function 03h(ハイレゾ) 分類 TIMER BIOS 名前 タイマキャンセル 対象 ハイレゾ 入力 AH=03h ES:BX=キャンセルするパラメータブロックのアドレス 出力 AH=終了条件(実際には終了条件が返らない。「機能」欄参照) 00h: 正常終了 FFh: ES:BXで指定されたメモリはパラメータブロックとして登録 されていない 解説 o INT 1Ch - Function 04h,05hで起動されたインターバルタイマの設定を キャンセルする。 u テクニカルデータブックには、AHに終了条件が返るという記述があるが、 実際には呼び出し前の状態から変化しない。 関連 INT 1Ch - Function 04h INT 1Ch - Function 05h INT 1Ch - Function 03h 分類 TIMER BIOS 名前 タイマBIOS内部使用 対象 ノーマル,PC-98LT・HA 入力 AH=03h 出力 なし 解説 o INT 08h割り込みハンドラから呼ばれる。 8253Aのチャネル0にインターバルタイマのカウント値(10ms周期)を ロードして、割り込みコントローラのタイマ割り込みを解除する。 関連 INT 1Ch - Function 02h INT 1Ch - Function 04h 分類 TIMER BIOS 名前 インターバルタイマの設定(マルチイベント対応,ワンショットモード) 対象 ハイレゾ 入力 AH=04h ES:BX=パラメータブロック(12バイト)のアドレス <パラメータブロックの形式> ------------------+-------------------------------------- アドレス |内容 ------------------+-------------------------------------- ES:BX+00h(DWORD) |BIOSワークエリア(次のパラメータブロックへのポインタ) ES:BX+04h(WORD) |BIOSワークエリア(リピーテッドモード用) ES:BX+06h(WORD) |インターバルタイマ値(単位:10ms) ES:BX+08h(DWORD) |タイムアウト時のユーザルーチンエントリ ------------------+-------------------------------------- * BIOSワークエリアはユーザが設定する必要はない 出力 AX=不定 解説 o このファンクションを実行してからES:BX+06hで指定された時間が経過すると、 ES:BX+08hで指定されたユーザルーチンが1回呼び出される。 このファンクションはマルチイベント対応なので、最初に設定した設定内容 (イベント)がタイムアウトする前に、別のイベントを追加登録することが できる。 u このファンクションを実行すると以下のような処理を行う。 - タイマ割り込みが使用中でなければ、ES:BXを0000:0444hにセットし、 タイマ(8253A)のチャネル0に10ms周期のパルスが発生するよう 設定。また、割り込みコントローラ(8259A)のマスタに、 INT 08h(外部割り込み)の割り込み許可の設定。 - タイマ割り込みが使用中だったときは、0000:0444hからのリンクをたどり、 今回指定したパラメータブロックをリンクに追加。 10ms毎に発生するINT 08h(外部割り込み)の割り込みハンドラは、 0000:0444hからのリンクをたどり、登録されている全てのイベントの インターバルタイマ値をデクリメントする。 インターバルタイマ値が0になってタイムアウトになったイベントがあると、 タイムアウト時のユーザルーチンエントリをパラメータブロックからINT 07h ベクタにコピーし、INT 07hを実行してユーザルーチンを呼び出す。 タイムアウトになったイベントのパラメータブロックは、リンクから削除 される。 o ユーザルーチンを作成する際は、以下のようにする。 - ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ ならない。 - ユーザルーチンに実行が移った状態では、CPUのIF(Interrupt Flag)は0 (割り込み禁止状態)。 - 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン 移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。 - ユーザルーチンの処理が終了したら、IRETで戻る。 u テクニカルデータブックには、ユーザルーチンからIRETする際、AHに00hを セットすると記述されているが、その必要はない。 u テクニカルデータブックにはAXが不定になるという記述があるが、 実際には変化しない。 関連 INT 1Ch - Function 02h INT 1Ch - Function 03h 0000:0444h 0000:0459h bit 5 INT 1Ch - Function 05h 分類 TIMER BIOS 名前 インターバルタイマの設定(マルチイベント対応,リピーテッドモード) 対象 ハイレゾ 入力 AH=05h ES:BX=パラメータブロックのアドレス <パラメータブロックの形式> ------------------+-------------------------------------- アドレス |内容 ------------------+-------------------------------------- ES:BX+00h(DWORD) |BIOSワークエリア(次のパラメータブロックへのポインタ) ES:BX+04h(WORD) |BIOSワークエリア(タイムアウト値の初期値) ES:BX+06h(WORD) |タイムアウト値(単位:10ms) ES:BX+08h(DWORD) |タイムアウト時のユーザルーチンエントリ ------------------+-------------------------------------- * BIOSワークエリアはユーザが設定する必要はない 出力 AX=不定 解説 o このファンクションを実行すると、ES:BX+06hで指定された時間間隔で、 ES:BX+08hで指定されたユーザルーチンが呼び出される。 このファンクションはマルチイベント対応なので、最初に設定した設定内容 (イベント)がタイムアウトする前に、別のイベントを追加登録することが できる。 u このファンクションを実行すると以下のような処理を行う。 - タイマ割り込みが使用中でなければ、ES:BXを0000:0444hにセットし、 タイマ(8253A)のチャネル0に10ms周期のパルスが発生するよう 設定。また、割り込みコントローラ(8259A)のマスタに、 INT 08h(外部割り込み)の割り込み許可の設定。 - タイマ割り込みが使用中だったときは、0000:0444hからのリンクをたどり、 今回指定したパラメータブロックをリンクに追加。 10ms毎に発生するINT 08h(外部割り込み)の割り込みハンドラは、 0000:0444hからのリンクをたどり、登録されている全てのイベントの インターバルタイマ値をデクリメントする。 インターバルタイマ値が0になってタイムアウトになったイベントがあると、 タイムアウト時のユーザルーチンエントリをパラメータブロックからINT 07h ベクタにコピーし、INT 07hを実行してユーザルーチンを呼び出す。 AH=00h以外でユーザルーチンから戻ったとき、このイベントは再設定される。 AH=00hでユーザルーチンから戻ったときは、このイベントのパラメータ ブロックは、リンクから削除される。 o ユーザルーチンを作成する際は、以下のようにする。 - ユーザルーチンのなかでは、フラグ以外の全レジスタを保証しなければ ならない。 - ユーザルーチンに実行が移った状態では、CPUのIF(Interrupt Flag)は0 (割り込み禁止状態)。 - 割り込みコントローラへのEOI(End Of Interrupt)の発行は、ユーザルーチン 移行前にBIOSが行っている。ユーザルーチン内でEOIを発行してはならない。 - ユーザルーチンの処理が終了したら、IRETで戻る。 - IRETで戻るとき、AHにリピート条件を設定する。 00h:リピート中止 FFh:リピート続行 u テクニカルデータブックにはAXが不定になるという記述があるが、 実際には変化しない。 関連 INT 1Ch - Function 02h INT 1Ch - Function 03h 0000:0444h 0000:0459h bit 5 INT 1Ch - Function 06h 分類 TIMER BIOS 名前 ビープ機能 対象 ハイレゾ 入力 AH=06h CX=鳴動時間(単位10msec) * 0のときは鳴らない DX=8253Aの分周値 出力 なし 解説 o 指定された時間と周波数でビープ音を鳴らす。ビープ停止はタイマ割り込みで 行うため、このファンクションの処理はビープ停止を待たずに終了する。 u このファンクションを実行しても、INT 18h - Function 23hで設定した デフォルトのブザー周波数には影響を与えない。 o INT 18h - Function 24hでは、DXに周波数を設定するのに対し、 このファンクションでは8253Aの分周値を設定する。 関連 INT 18h - Function 24h 0000:0448h 0000:044Ah INT 1Ch - Function 07h 分類 TIMER BIOS 名前 アラーム機能の設定 対象 PC-98HA 入力 AH=07h ES:BX=データバッファ(6バイト) <データバッファの形式> ------------------+----------------------------------- アドレス |内容 ------------------+----------------------------------- ES:BX+00h |月(BCD:01〜12h) ES:BX+01h |日(BCD:01〜31h) ES:BX+02h |曜日(常にFFhを設定) ES:BX+03h |時(BCD:00〜23h) ES:BX+04h |分(BCD:00〜59h) ES:BX+05h |秒(BCD:00〜59h) ------------------+----------------------------------- * 0Fhを設定すると、その桁は常に設定時刻と一致しているものと みなされる。0Fhは4ビットごとに設定可能。 出力 CF=終了条件(実際には終了条件が返らない。「機能」欄参照) 1=異常終了 0=正常終了 解説 o 指定した時刻になると、電源OFFなら自動的に電源がONになり、 アラーム鳴動用ファンクション(INT 1Fh - Function 8Eh,8Fh)を 実行する。 o アプリケーションまたはドライバがアラーム(ブザー)を鳴動させる場合 には、INT 1Fh - Function 8Eh,8Fhをトラップして、ブザー鳴動の処理を 独自に行う必要がある。 u テクニカルデータブックには、CFに終了条件が返るという記述があるが、 実際には常に0になる。 関連 INT 1Ch - Function 08h INT 1Ch - Function 09h INT 1Fh - Function 8Eh INT 1Fh - Function 8Fh I/O 0022h INT 1Ch - Function 08h 分類 TIMER BIOS 名前 アラーム設定の解除 対象 PC-98HA 入力 AH=08h 出力 CF=終了条件(実際には終了条件が返らない。「機能」欄参照) 1=異常終了 0=正常終了 解説 o INT 1Ch - Function 07hで設定したアラームの設定を解除する。 u テクニカルデータブックには、CFに終了条件が返るという記述があるが、 実際には常に0になる。 関連 INT 1Ch - Function 07h INT 1Ch - Function 09h 分類 TIMER BIOS 名前 アラーム設定状態の読み出し 対象 PC-98HA 入力 AH=09h ES:BX=データバッファの先頭アドレス 出力 CF=終了ステータス 1=設定あり 0=設定なし 解説 o INT 1Ch - Function 07hで設定したアラームの設定内容を読み出す。 設定があった場合、ES:BXで指定されたバッファに日付・時刻データを 書き込む。バッファのフォーマットはファンクション07hと同じ。 関連 INT 1Ch - Function 07h